package org.example.lambda;

/**
 * FunctionalInterface它们主要用在Lambda表达式和方法引用上。
 */
public class FunctionalInterfaceDemo {
    /*
    方便传入独立的方法
     */
    public static void invokeFirstFunc(MyFirstFunInterFace firstFunInterFace)
    {
        firstFunInterFace.onlyOneFun();
    }

    public static void main(String[] args){
        oldWay();

        lambdaWay();

        doubleColonWayOne();

        doubleColonWayTwo();
    }

    public static void oldWay()
    {
        MyFirstFunInterFace firstFunInterFace = new MyFirstFunInterFace() {
            @Override
            public void onlyOneFun() {
                System.out.println("old way");
            }
        };
        invokeFirstFunc(firstFunInterFace);
    }

    /*
     *lambda的方式极大的简化了写法
     */
    public static void lambdaWay()
    {
        invokeFirstFunc(()->System.out.println("lambda way"));
    }

    public static void myPrintOne()
    {
        System.out.println(":: refer static function ");
    }

    /*
     "::"官网对这个符号的解释是方法引用,也就是引用一个方法的意思,英文名称Method References
      你的项目里某个地方存在了一个符合当前逻辑的lambda表达式的方法, 那么我是可以直接哪来用，并赋值到lambda表达式可以使用的地方
     */
    public static void doubleColonWayOne()
    {
        invokeFirstFunc(FunctionalInterfaceDemo::myPrintOne);
    }

    public  void myPrintTow()
    {
        System.out.println(":: refer common function ");
    }

    public static void doubleColonWayTwo()
    {
        FunctionalInterfaceDemo functionalInterfaceDemo = new FunctionalInterfaceDemo();
        invokeFirstFunc(functionalInterfaceDemo::myPrintTow);
    }
}
